package controller;

import java.util.List;

import model.entidades.Convenio;
import model.repositorio.ConvenioDAO;
import model.repositorio.EnderecoConvenioDAO;
import utils.Constantes;
import utils.Validacao;
import view.convenio.TelaCadastrarConvenio;

public class ControladorConvenio {

	private TelaCadastrarConvenio tela;
	private ConvenioDAO convenioDAO;
	private EnderecoConvenioDAO enderecoConvenioDAO;

	final boolean VALIDO = false;
	final boolean INVALIDO = true;

	public ControladorConvenio(TelaCadastrarConvenio tela){
		this.tela = tela;
		convenioDAO = new ConvenioDAO();
		enderecoConvenioDAO = new EnderecoConvenioDAO();
	}

	public void salvar(Convenio convenio) throws ControladorExcecao {
		int contaErros = 0;
		if (convenio == null) {
			throw new ControladorExcecao(ControladorExcecao.CONVENIO_NULO);
		} else {
			if (tela.getComboBoxDesconto().getSelectedIndex() == 0 && convenio.getPercentualDescontoMaximo() <= 0.0) {
				tela.mostraCampoInvalido(tela.getLblPercentualDesconto(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.PERCENTUAL_DESCONTO);
			} else {
				tela.mostraCampoInvalido(tela.getLblPercentualDesconto(), VALIDO);
			}
			
			if (convenio.getRazaoSocial() != null && convenio.getRazaoSocial().length() > 2) {
				tela.mostraCampoInvalido(tela.getLblRazaoSocial(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblRazaoSocial(), INVALIDO);
			}

			if (convenio.getNomeExibicao() != null && convenio.getNomeExibicao().length() > 2) {
				tela.mostraCampoInvalido(tela.getLblNomeExibicao(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblNomeExibicao(), INVALIDO);
			}

			if (convenio.getCnpj() != null && convenio.getCnpj().length() == 14) {
				tela.mostraCampoInvalido(tela.getLblCnpj(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCnpj(), INVALIDO);
			}

			if (convenio.getEndereco().getLogradouro() != null && convenio.getEndereco().getLogradouro().length() > 3) {
				tela.mostraCampoInvalido(tela.getLblLogradouro(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblLogradouro(), INVALIDO);
			}

			if (convenio.getEndereco().getCidade() != null && convenio.getEndereco().getCidade().length() >= 3) {
				tela.mostraCampoInvalido(tela.getLblCidade(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCidade(), INVALIDO);
			}

			if (convenio.getEndereco().getCep() != null && convenio.getEndereco().getCep().length() == 8) {
				tela.mostraCampoInvalido(tela.getLblCep(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCep(), INVALIDO);
			}

			if (convenio.getEmail().length() > 0 && !Validacao.verificaEmail(convenio.getEmail())) {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblEmail(), INVALIDO);
			} else {
				tela.mostraCampoInvalido(tela.getLblEmail(), VALIDO);
			}
		}

		if (contaErros > 0) {
			throw new ControladorExcecao(ControladorExcecao.ERRO_VALIDACAO);
		} else {
			Convenio convenioTesteCNPJ = convenioDAO.buscaPorCNPJ(convenio.getCnpj());
			Convenio convenioTesteNomeExibicao = convenioDAO.buscaPorNomeExibicao(convenio.getNomeExibicao());
			if(convenioTesteCNPJ == null || convenioTesteCNPJ.getId() == convenio.getId()) {
				if(convenioTesteNomeExibicao == null || convenioTesteNomeExibicao.getId() == convenio.getId()) {
					
					if(convenio.getSituacao().equalsIgnoreCase(Constantes.INATIVO)) {
						convenio.getListaProfissionaisConveniados().clear();
					}
					
					enderecoConvenioDAO.salvar(convenio.getEndereco());
					convenioDAO.salvar(convenio);
				} else {
					tela.mostraCampoInvalido(tela.getLblNomeExibicao(), INVALIDO);
					throw new ControladorExcecao(ControladorExcecao.NOME_EXIBICAO_CONVENIO);
				}
			} else {
				tela.mostraCampoInvalido(tela.getLblCnpj(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.CNPJ_CONVENIO_CADASTRADO);
			}
		}
	}

	public void alterarListaProfissionaisConveniados(Convenio convenio) {
		convenioDAO.salvar(convenio);
	}
	
	public List<Convenio> pesquisarConvenio(String situacao) throws ControladorExcecao {

		List<Convenio> lista = convenioDAO.buscaPorParametros(situacao);

		if (lista == null) {
			throw new ControladorExcecao(ControladorExcecao.PESQUISA_USUARIO);
		} else {
			return lista;
		}

	}

}
